Enable PSCI_STAT_COUNT/RESIDENCY for ARM standard platforms
authorSoby Mathew <[email protected]>
Mon, 23 May 2016 15:07:53 +0000 (16:07 +0100)
committerSoby Mathew <[email protected]>
Thu, 16 Jun 2016 07:55:00 +0000 (08:55 +0100)
This patch enables optional PSCI functions `PSCI_STAT_COUNT` and
`PSCI_STAT_RESIDENCY` for ARM standard platforms. The optional platform
API 'translate_power_state_by_mpidr()' is implemented for the Juno
platform. 'validate_power_state()' on Juno downgrades PSCI CPU_SUSPEND
requests for the system power level to the cluster power level.
Hence, it is not suitable for validating the 'power_state' parameter
passed in a PSCI_STAT_COUNT/RESIDENCY call.

Change-Id: I9548322676fa468d22912392f2325c2a9f96e4d2

plat/arm/board/juno/juno_pm.c
plat/arm/common/arm_common.mk

index 4b956d2c2eb99060f0d932417ec96de8c91fdd4b..cbf994a4713f0ff10a6b33b4c892520c245ab905 100644 (file)
@@ -59,6 +59,19 @@ static int juno_validate_power_state(unsigned int power_state,
        return rc;
 }
 
+/*
+ * Custom `translate_power_state_by_mpidr` handler for Juno. Unlike in the
+ * `juno_validate_power_state`, we do not down-grade the system power
+ * domain level request in `power_state` as it will be used to query the
+ * PSCI_STAT_COUNT/RESIDENCY at the system power domain level.
+ */
+static int juno_translate_power_state_by_mpidr(u_register_t mpidr,
+               unsigned int power_state,
+               psci_power_state_t *output_state)
+{
+       return arm_validate_power_state(power_state, output_state);
+}
+
 /*******************************************************************************
  * Export the platform handlers via plat_arm_psci_pm_ops. The ARM Standard
  * platform will take care of registering the handlers with PSCI.
@@ -74,5 +87,6 @@ const plat_psci_ops_t plat_arm_psci_pm_ops = {
        .system_reset                   = css_system_reset,
        .validate_power_state           = juno_validate_power_state,
        .validate_ns_entrypoint         = arm_validate_ns_entrypoint,
-       .get_sys_suspend_power_state    = css_get_sys_suspend_power_state
+       .get_sys_suspend_power_state    = css_get_sys_suspend_power_state,
+       .translate_power_state_by_mpidr = juno_translate_power_state_by_mpidr
 };
index 0b288617602e6d5bb4e18b045791cd4ccea2ec92..bcb3f6f6ece98cff6ca8b309081c9f4233a409f2 100644 (file)
@@ -82,6 +82,9 @@ ARM_BL31_IN_DRAM              :=      0
 $(eval $(call assert_boolean,ARM_BL31_IN_DRAM))
 $(eval $(call add_define,ARM_BL31_IN_DRAM))
 
+# Enable PSCI_STAT_COUNT/RESIDENCY APIs on ARM platforms
+ENABLE_PSCI_STAT = 1
+
 PLAT_INCLUDES          +=      -Iinclude/common/tbbr                           \
                                -Iinclude/plat/arm/common                       \
                                -Iinclude/plat/arm/common/aarch64